USRP N310,Gnuradio初探 您所在的位置:网站首页 usrp n310 怎么单独收数据 USRP N310,Gnuradio初探

USRP N310,Gnuradio初探

2024-06-15 21:37| 来源: 网络整理| 查看: 265

文章目录 实验平台USRP-OFDM发送端框架发送端模块简介OFDM符号结构发送端外部TCP客户端程序USRP-OFDM接收端框架接收端模块简介接收端外部TCP服务端程序TCP客户端服务器注意事项 输入数据编码选择IP数据帧传输效率参考资料

近期实验需要搭建一个软件无线电环境平台,在琢磨一段时间后,以下是对之前的实验总结一下。

实验平台 硬件:笔记本2台,USRP N310两台,及辅助天线等软件:在Ubuntu系统下安装Gnuradio3.7 实验前提,USRP能与电脑建立收发通信 USRP-OFDM发送端框架

在这里插入图片描述 ​利用Socket PDU模块与外部程序建立TCP连接,通过外部程序向9090端口发送数据从而写入发送端,经PDU to Tagged Stream将协议数据转换为byte格式数据,再经过CRC32给数据加上循环冗余校验码,再分两路生成数据头部和数据载荷部分,分别进行BPSK与QPSK映射,通过Tagged Stream Mux模块组装在一起,然后经过OFDM调制部分,分别进行载频子波分配、加入导频系列、加入同步字与循环前缀,再通过Multiply Const进行约束,防止波形发生非线性失真,Tag Gate模块抑制标记符号向下传递,最后通过UHD:USRP Sink 模块连接硬件设备,对数据进行DAC转换,数字变频发送到环境空间。

发送端模块简介

​ Socket PDU:与外部程序建立socket连接,对整个流图进行数据输入。

​ PDU to Tagged Stream:将协议数据转化为固定长度byte类型数据,并给数据加上长度标记。

​ Stream CRC32:给数据尾部加上32位(4字节)循环冗余校验-----信道编码。

​ Protocol Formatter:利用数据头生成对象创建一个6字节的数据头,包含数据帧长度,当前数据帧号等。

​ Repack Bits:对数据进行重新打包,8bits一组转换为2bits一组或者1bit一组的数据,为后续进行BPSK、 QPSK映射,此过程不存在数据bit丢失。

​ Chunks to Symbols:根据Symbol Table将byte数据进行浮点数或者复数映射,byte型数据转换为复数型数 据。

​ Tagged Stream Mux:将头部BPSK符号与载荷QPSK符号组装在一起进行OFDM调制。

​ OFDM Carrier Allocator:OFDM子载波分配,分配数据子载波,导频子载波,同步子载波,直流子载波。

​ FFT:对分配后的子载波进行傅里叶变换,完成OFDM调制。

​ OFDM Cyclic Prefixer:给OFDM加入循环前缀,防止ofdm符号间干扰(ISI)。

​ Multiply Const:乘常数模块,乘以小于1的值,限制幅度,防止发送非线性失真。

​ Tag Gate:阻止标记符号向后延续。

​ 其他参数:

​ protocol parser: 协议分析器

​ FEC: 前向纠错编码,送入传输信道之前

​ MSB: 最高位有效

​ Becimation: 抽取,转变频率

OFDM符号结构

ofdm输出标签:载波偏移,信道均衡系数,数据帧,接收时间

ofdm子载波: 左6个子载波[-32,-27],右5个子载波[26,31]为虚拟子载波

​ 不使用载波为0,———减少带外功率,抑制ACI(相邻信道干扰)

一个OFDM符号:包含 虚拟子载波 ,直流子载波 ,射频子载波 ,有效数据子载波

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CfNVPpsv-1601025338052)(D:\实验作图记录\OFDM符号结构.jpg)]

​ 以进行64FFT变换为例,总载波个数为64,除去虚拟子载波,直流子载波,射频子载波,剩余有效数据子载波48个,数据头部Head采用BPSK调制,(6 * 8)/1一个符号用一位比特表示,数据载荷加上校验码Payload部分采用QBSK调制,((96+4 )* 8)/2,一个符号用两个比特位表示。数据生成头部加载荷总共需要OFDM符号个数: ( 6 ∗ 8 ) / 1 + ( 96 + 4 ) ∗ 8 / 2 = 448 (6*8)/1 + (96 + 4 )*8 / 2 = 448 (6∗8)/1+(96+4)∗8/2=448

448 / 48 ≈ 10 个 O F D M 符 号 448 / 48 ≈ 10 个OFDM符号 448/48≈10个OFDM符号

​ 加上2个OFDM符号同步字,发送一次数据共需要 12 个OFDM符号周期。

发送端外部TCP客户端程序 import socket import time """ tcp 客户端,输入发送内容,从文件读出数据,按照每次96字节方式发送 """ def main1(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.10.3', 9090)) while True: tmp = input('请输入您要发送的内容:') if tmp != 'exit': s.send('{}\n'.format(tmp).encode('utf-8')) print('{}\n'.format(tmp).encode()) else: break def main(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.10.3', 9090)) with open('./SendData', 'r', encoding='utf-8') as R_file: while True: content = R_file.read(96) if content != '': s.send('{}'.format(content).encode('utf-8')) print(content, end='') time.sleep(0.01) else: print('数据发送结束!!!') s.close() break if __name__ == '__main__': main() # main1() USRP-OFDM接收端框架

在这里插入图片描述 ​ 通过UHD:USRP Source模块接收空间中的电磁数据,通过去频偏,同步去数据头分离出载荷,OFDM解调,IFFT变换,解符号映射,CRC32校验,再通过Socket PDU与外部TCP服务器连接,解码恢复出发送的数据。

接收端模块简介

​ UHD USRP Source:与硬件USRP N310 连接,接收空间中电磁数据,实现数字下变频,ADC变换,转换为基 带信号输入给Gunradio软件款图。

​ Schmidl & Cox OFDM Synch​:实现符号定时同步,除去小数部分载波频偏​。

​ Delay:延时模块,延迟一个ofdm符号周期,fft_len + 循环前缀(64+16)。

​ Frequency Mod:频率调制模块,产生一个和载波频偏对应的序列,与接收数据流相乘,达到去载波频偏。

​ Multiply:两数据相乘,去除小数载波频偏,消除ACI干扰。

​ Head/Payload Demux:根据定时信息与帧头信息,将数据头与载荷部分分开,输入信号分别为去除载波频偏 的数据流,触发信息,解码后的帧头信息。输出为帧头部数据,载荷数据。

​ FFT:进行逆傅里叶变换。

​ OFDM Channel Estimation:信道评估模块,得到整数倍频偏和系统频域响应。

​ OFDM Frame Equalizer:OFDM帧均衡模块,纠正整数倍频偏,对接收信号进行均衡。

​ OFDM Serializer:逆OFDM子载波分配,与发送端OFDM Carrier Allocator 相逆的过程,找到携带数据的48 个子载波,并提取出其信息。

​ Constellation Decoder:解符号映射,分别进行逆BPSK,QPSK映射,转化为byte类型数据。

​ Repack Bits:与发送端相逆的过程,字节重新组合,不丢失比特信息。

​ Stream CRC32:循环冗余校验,校验数据是否出错并输出。

​ Tagged Stream to PDU:byte类型数据转换为协议数据。

​ Socket PDU:与外部程序建立socket连接。

接收端外部TCP服务端程序 import socket """ tcp 服务端,接收客户端发送的数据 """ def main(): host = '192.168.10.1' port = 9090 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((host, port)) server_socket.listen(1) client_socket, client_add = server_socket.accept() while True: data = client_socket.recv(1024) data = data.decode('utf-8') print(data) # client_socket.close() if __name__ == '__main__': main() TCP客户端服务器注意事项 TCP服务器端需要先绑定IP与端口,等待客户端连接,客户端则不需要TCP客户端需先与服务器端建立连接才能通信TCP 三次握手 输入数据编码选择

ASCII:128个字符,单字节编码,目前只使用低7位二进制表示,保留最高位,A-65,a-97,0-48

UTF-8:可变长字节编码,1-4字节:

US-ASCII:1字节拉丁文,希腊字母,阿拉伯文:2字节中日韩,东南亚文字:3字节少数语言字符:4字节

GBK:汉字编码字符集

IP数据帧传输效率

​ IP数据帧:MTU,包含头部信息14个字节,尾部校验和FCS 4个字节,以太网数据帧的传输效率: α = ( T − 14 − 4 ) / T α=(T-14-4)/T α=(T−14−4)/T

参考资料

1.USRP—OFDM通信实验报告. 2.GNU Radio教程. 3.Linux系统下搭建USRP + GNU Radio开发环境. 4.OFDM调制理解. 5.PDU(协议数据单元). 6.Python学习笔记——网络-TCP.



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有